package com.example.demo.threadDemo.aCreateThread;

/**
 * @Description ACreateThreadMethod3
 * @Author songchuanlong
 * @Date 2025-04-14
 */

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 前两种线程创建方式都存在的一个问题：假如线程执行完毕后有一些数据需要返回，他们重写的run方法均不能直接返回结果！
 * 怎么解决这个问题?
 * JDK 5.0提供了Callable接口和FutureTask类来实现(多线程的第三种创建方式)
 *
 * Step一：创建任务对象
 * 定义一个类实现Callable接口，重写call方法，封装要做的事情，和要返回的数据。把Callable类型的对象封装成FutureTask(线程任务对象)
 * Step二：将任务对象交给Thread对象
 * Step三：调用Thread的start方法
 * Step四：线程执行完毕后、通过FutureTask对象的的get方法去获取线程任务执行的结果
 *
 *
 * 优点:线程任务类只是实现接口，可以继续继承类和实现接口，扩展性强:可以在线程执行完毕后去获取线程执行的结果
 * 缺点:编码复杂一点。
 *
 */
public class ACreateThreadMethod3 {
    public static void main(String[] args) throws Exception{
        //创建一个Callable对象
        Callable<String> myThresd3 = new MyThresd3(100);
        //把Callable类型的对象封装成FutureTask(线程任务对象)
        //未来任务对象(FutureTask)的作用?
        //1、是一个任务对象，实现了Runnable对象.
        //2、可以在线程执行完毕之后，用未来任务对象调用get方法获取线程执行完毕后的结果。
        FutureTask<String> futureTask= new FutureTask<>(myThresd3);
        //把任务对象交给一个Thread对象
        new Thread(futureTask).start();
        //线程执行完毕后、通过FutureTask对象的的get方法去获取线程任务执行的结果
        //注意:如果执行到这儿，假如上面的线程还没有执行完毕
        //tring s = futureTask.get();这里的代码会暂停，等待上面线程执行完毕后才会获取结果。
        String s = futureTask.get();
        System.out.println(s);
    }
}
